return self.getDeviceController(deviceClass).createDevice(devconfig)
+ def waitForDevices_(self, deviceClass):
+ return self.getDeviceController(deviceClass).waitForDevices()
+
+
+ def waitForDevice(self, deviceClass, devid):
+ return self.getDeviceController(deviceClass).waitForDevice(devid)
+
+
def reconfigureDevice(self, deviceClass, devid, devconfig):
return self.getDeviceController(deviceClass).reconfigureDevice(
devid, devconfig)
self.image.createDeviceModel()
+ def waitForDevices(self):
+ """Wait for this domain's configured devices to connect.
+
+ @raise: VmError if any device fails to initialise.
+ """
+ for c in controllerClasses:
+ self.waitForDevices_(c)
+
+
def device_create(self, dev_config):
"""Create a new device.
"""
dev_type = sxp.name(dev_config)
devid = self.createDevice(dev_type, dev_config)
+ self.waitForDevice(dev_type, devid)
# self.config.append(['device', dev.getConfig()])
return self.getDeviceController(dev_type).sxpr(devid)
self.writeDetails(config, devid, back, front)
+ return devid
+
+
+ def waitForDevices(self):
+ log.debug("Waiting for devices %s.", self.deviceClass)
+
+ return map(self.waitForDevice, self.deviceIDs())
+
+
+ def waitForDevice(self, devid):
+ log.debug("Waiting for %s.", devid)
+
status, fn_ret = self.waitForBackend(devid)
if status:
self.destroyDevice(devid)
raise VmError( ("Device %s (%s) could not be connected. "
"Backend device not found!")
% (devid, self.deviceClass))
- return devid
def reconfigureDevice(self, devid, config):
specified device. This would be suitable for giving to {@link
#createDevice} in order to recreate that device."""
- backdomid = int(xstransact.Read(self.frontendPath(devid),
- "backend-id"))
-
- return [self.deviceClass, ['backend', backdomid]]
+ backdomid = xstransact.Read(self.frontendPath(devid), "backend-id")
+ if backdomid is None:
+ raise VmError("Device %s not connected" % devid)
+
+ return [self.deviceClass, ['backend', int(backdomid)]]
def sxprs(self):
def readBackend(self, devid, *args):
frontpath = self.frontendPath(devid)
backpath = xstransact.Read(frontpath, "backend")
- return xstransact.Read(backpath, *args)
+ if backpath:
+ return xstransact.Read(backpath, *args)
+ else:
+ raise VmError("Device %s not connected" % devid)
def deviceIDs(self):
frontpath = self.frontendPath(devid)
backpath = self.backendPath(backdom, devid)
+ xstransact.Remove(backpath, HOTPLUG_STATUS_NODE)
+
frontDetails.update({
'backend' : backpath,
'backend-id' : "%i" % backdom.getDomid()
ev = Event()
def hotplugStatus():
- status = self.readBackend(devid, HOTPLUG_STATUS_NODE)
+ try:
+ status = self.readBackend(devid, HOTPLUG_STATUS_NODE)
+ except VmError:
+ status = "died"
if status is not None:
watch.xs.unwatch(backpath, watch)
hotplugStatus.value = status
frontpath = self.frontendPath(devid)
backpath = xstransact.Read(frontpath, "backend")
- watch = xswatch(backpath, hotplugStatus)
+ if backpath:
+ watch = xswatch(backpath, hotplugStatus)
- ev.wait(DEVICE_CREATE_TIMEOUT)
- if ev.isSet():
- return (0, hotplugStatus.value)
+ ev.wait(DEVICE_CREATE_TIMEOUT)
+ if ev.isSet():
+ return (0, hotplugStatus.value)
+ else:
+ return (-1, hotplugStatus.value)
else:
- return (-1, hotplugStatus.value)
-
+ return (-1, "missing")
def backendPath(self, backdom, devid):
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#============================================================================
# Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com>
+# Copyright (C) 2005 Xensource Ltd
#============================================================================
from xen.web import http
self.acceptCommand(req)
return self.dom.send_sysrq(int(req.args['key'][0]))
+ def op_wait_for_devices(self, _, req):
+ self.acceptCommand(req)
+ return self.dom.waitForDevices()
+
def op_destroy(self, _, req):
self.acceptCommand(req)
return self.xd.domain_destroy(self.dom.domid)